package cn.learn.validate;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * 分发 验证码处理器持有者处理器（确定是哪一个处理器的对象）
 *
 * @author huangyezhan
 * @date 2020年2月18日21:36:11
 */
@Component
public class ValidateCodeProcessorHolder {

	/**
	 * spring生成bean的名字规则：
	 * ①如果发现类的前两个字符都是大写，则直接返回类名
	 * ②将类名的第一个字母转成小写，然后返回
	 * ③自定义bean的名称
	 *
	 * 这里的key为bean的名称，value为实现了{@link ValidateCodeProcessor}接口的对象
	 */
	@Autowired
	private Map<String, ValidateCodeProcessor> validateCodeProcessors;


	/**
	 * 获取验证码处理器
	 * @param type	验证码类型
	 * @return
	 */
	public ValidateCodeProcessor findValidateCodeProcessor(ValidateCodeType type) {
		return findValidateCodeProcessor(type.toString().toLowerCase());
	}

	public ValidateCodeProcessor findValidateCodeProcessor(String type) {
		String name = type.toLowerCase() + ValidateCodeProcessor.class.getSimpleName();
        ValidateCodeProcessor processor = validateCodeProcessors.get(name);
		if (processor == null) {
			throw new ValidateCodeException("创建验证码处理器" + name + "不存在");
		}
		return processor;
	}

}
